//!
/**
 ***********************************************************************************************************
 * <RBProfiler implementation>
 ***********************************************************************************************************
 * @file RBProfiler.cpp
 ***********************************************************************************************************/

/************************************************************************************************************
 * Includes
 ************************************************************************************************************/
#include "RBMainPCH.h"
#include "RBProfiler.h"

/************************************************************************************************************
 * Macros
 ************************************************************************************************************/

/************************************************************************************************************
 * Classes implementation
 ************************************************************************************************************/

/************************************************************************************************************/

/***********************************************************************************************************
 * 
 ***********************************************************************************************************/
RBProfilerManager::RBProfilerManager()
{

}

/***********************************************************************************************************
 * 
 ***********************************************************************************************************/
RBProfilerManager::~RBProfilerManager()
{
    for (uint32 ui = 0; ui < Profilers.size(); ++ui)
    {
        delete Profilers[ui];
    }
}

/***********************************************************************************************************
 * 
 ***********************************************************************************************************/
RBProfiler::RBProfiler(const char* pcBlockName)
: m_pcBlockName(pcBlockName)
{
    RBProfilerManager::GetSingleton()->Profilers.push_back(this);
    Reset();
}

/***********************************************************************************************************
 * 
 ***********************************************************************************************************/
RBProfiler::~RBProfiler()
{
    // Don't remove from mgr list: it will be done by its destructor
}

/***********************************************************************************************************
 * 
 ***********************************************************************************************************/
void RBProfiler::Start()
{
    if (m_bStopped)
    {
        m_kTimer.Reset();
        m_bStopped = false;
    }
}

/***********************************************************************************************************
 * 
 ***********************************************************************************************************/
void RBProfiler::Stop()
{
    if (!m_bStopped)
    {
        m_uiTimeElapsed += static_cast<uint32>(m_kTimer.GetTime() * 1000.0f);
        m_bStopped = true;
    }
}

/***********************************************************************************************************
 * 
 ***********************************************************************************************************/
void RBProfiler::Reset()
{
    m_uiTimeElapsed = 0;
    m_bStopped = true;
}

/***********************************************************************************************************
 * 
 ***********************************************************************************************************/
uint32 RBProfiler::GetDuration()
{
    RBAssert(m_bStopped, "Trying to get duration while profiler has not been stopped");
    return m_uiTimeElapsed;
}

const char* RBProfiler::GetBlockName()
{
    return m_pcBlockName;
}
